﻿// Inner Fire 游戏引擎库
// AvatarAttach - 通用骨架附着设定。
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 管理武器和道具附着在骨骼上的东西。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-06-11

#pragma once

#include "avatar_id.h"
#include <graphics/graphics_def.h>
#include <graphics/transform_def.h>
#include <static_string.h>
#include <xml_reader.h>

namespace ifire::game {

// 默认的ID，这几种是必须占有位置的，其它的ID必须在这个之后
enum AvatarAttachType {
  None = -1,
  Weapon1 = 0,
  Weapon2 = 1,
  Shield = 2,
  Follow = 3,
  Extra = 4
};

/// <summary>
/// 用于Attack的计算
/// </summary>
class AvatarAttachPlan {
public:
  AvatarAttachPlan(const ikit::XmlNode& node);
  AvatarAttachPlan(const AvatarAttachPlan& lhs) = delete;
  AvatarAttachPlan& operator=(const AvatarAttachPlan& lhs) = delete;
  ~AvatarAttachPlan() = default;

public:
  // 变换
  Trans3 trans;
  // 这个Plan适配的Avatar
  eastl::vector<ikit::sstr> avatars;
  // 这个Plan适配的动画
  eastl::vector<ikit::sstr> actions;
};

class AvatarAttach {
public:
  AvatarAttach(const ikit::XmlNode& node);
  AvatarAttach(const AvatarAttach& lhs) = delete;
  AvatarAttach& operator=(const AvatarAttach& lhs) = delete;
  ~AvatarAttach() = default;

  // 从Plan中获得合适的项目，如果不合适，那么返回默认的变换
  const Trans3& Pick(ikit::sstr avatar_name, ikit::sstr clip_name) const;
  // 获得默认的项目
  const Trans3& GetDefault() const { return trans; }

public:
  // ID，直接访问
  int id;
  // 名称，直接访问
  ikit::sstr name;
  // 绑定到哪个骨骼上
  ikit::sstr bone;
  // 默认的变换（没有找到任何匹配时的变换）
  Trans3 trans;
  // 旋转（因为我的四元数存在问题，所以需要一个原生的数值）
  IVec3 rotation;

private:
  // 项目的计划
  eastl::vector<std::unique_ptr<AvatarAttachPlan>> plans_;
};

AvatarAttachType ParseAvatarAttachType(ikit::sstr name);

} // namespace ifire::game